package main.java.easy;

import java.util.HashMap;

/**
 * @Author: 郑国荣
 * @Date: 2023-07-03-17:26
 * @Description: 罗马数字包含以下七种字符: I， V， X， L，C，D 和 M。
 * 字符          数值
 * I             1
 * V             5
 * X             10
 * L             50
 * C             100
 * D             500
 * M             1000
 * 例如， 罗马数字 2 写做II，即为两个并列的 1 。12 写做XII，即为X+II。 27 写做XXVII, 即为XX+V+II。

 * 通常情况下，罗马数字中小的数字在大的数字的右边。但也存在特例，例如 4 不写做IIII，而是IV。
 * 数字 1 在数字 5 的左边，所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地，数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况：
 * I可以放在V(5) 和X(10) 的左边，来表示 4 和 9。
 * X可以放在L(50) 和C(100) 的左边，来表示 40 和90。
 * C可以放在D(500) 和M(1000) 的左边，来表示400 和900。

 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。


 * 在一般情况下，使用switch语句的查找效率通常比HashMap快。这是因为switch语句是通过跳转表格（jump table）
 * 或类似的机制来执行匹配操作，而HashMap是使用哈希算法计算键的哈希值，然后通过哈希值进行索引，最后在可能的哈希
 * 冲突中进行键的比较。

 * 当switch语句的分支数量较少且分支的取值范围相对连续时，它的查找效率会非常高，因为它可以通过简单的跳转表格来直
 * 接定位到分支对应的代码块，时间复杂度为O(1)。这是因为switch语句会将分支的取值作为索引，而不需要进行哈希计算和
 * 键的比较操作。
 */
public class RomanToInt {


    /**
     * 将罗马数字转化为阿拉伯数字
     */
    public static int romanToInt(String s) {
        int sum = 0;
        int preNum = getNum(s.charAt(0));
        for(int i = 1;i < s.length(); i ++) {
            int num = getNum(s.charAt(i));
            if(preNum < num) {
                sum -= preNum;
            } else {
                sum += preNum;
            }
            preNum = num;
        }
        sum += preNum;
        return sum;
    }

    /**
     * 根据罗马数字获取阿拉伯数字
     */
    private static int getNum(char a) {
        return switch (a) {
            case 'I' -> 1;
            case 'V' -> 5;
            case 'X' -> 10;
            case 'L' -> 50;
            case 'C' -> 100;
            case 'D' -> 500;
            case 'M' -> 1000;
            default -> 0;
        };
    }

    /**
     * 将阿拉伯数字转化为罗马数字
     */
    public static String IntToRoman(int val){
        StringBuilder valuable = new StringBuilder();
        HashMap<Integer, String> hashMap = new HashMap<>() {{
            put(1, "I");
            put(5, "V");
            put(10, "X");
            put(50, "L");
            put(100, "C");
            put(500, "D");
            put(1000, "M");
        }};


        while (val!=0){
            if (val/1000!=0){
                valuable.append(hashMap.get(1000));
                val-=1000;
            }else if (val/500!=0){
                valuable.append(hashMap.get(500));
                val-=500;
            } else if (val/100!=0) {
                valuable.append(hashMap.get(100));
                val-=100;
            } else if (val/50!=0){
                valuable.append(hashMap.get(50));
                val-=50;
            }else if (val/10!=0){
                valuable.append(hashMap.get(10));
                val-=10;
            }else if (val/5!=0){
                valuable.append(hashMap.get(5));
                val-=5;
            }else {
                valuable.append(hashMap.get(1));
                val--;
            }

        }
        return valuable.toString();
    }

    public static void main(String[] args) {

//        System.out.println(IntToRoman(1001));
        System.out.println(romanToInt("LVIII"));
    }
}
